// IO 函子  //函子内部包装了一些函数
const fp = require('lodash/fp')

class IO {
    static of (value) {
        //将取值过程包装到函数内 即将传入值包装到匿名函数内
        return new IO(function(){
            return value;
        });
    } 

    constructor (fn) {
        this._value = fn;
    }

    map (fn) {
        //将原来的函数与传入的函数组合成新的函数
        //此处新IO内的函数可能是不纯的 但是将其的副作用延迟到了调用的时候
        return new IO(fp.flowRight(fn, this._value))
    }
}

//调用IO函子
//process.execPath 当前执行进程的路径
//map内的函数有可能是一个不纯的函数  但IO返回的始终是一个纯的操作 当前执行的也始终是一个纯的操作
let r = IO.of(process)
    .map(p => p.execPath);
// console.log(r);

//调用IO函子内的_value函数
console.log(r._value());